/**
 * ***************************************
 * @file can_drv.h
 * @author: AnRui
 * @version 0.1
 * @date  : 2025-07-29
 * @copyright Copyright (c) 2025
 * @desc:
 *     1.CAN 引脚 一个发送引脚 推挽输出
 *                一个接收引脚 上拉输入
 *    2. 接收结构体中的 rx_fi 过滤器索引 不等于过滤器编号  没有太深的研究
 *    3..CAN过滤器配置:
 *        注意: 每个过滤器都包含两个32bit的寄存器 FDATA0  FDATA1 通过源码分析得到:
 *         FDATA0: filter_list_high  filter_list_low
 *         FDATA1: filter_mask_high  filter_mask_low
 *         FDATA0 FDATA1 都可以用作ID配置 FDATA1 还可以用作屏蔽位配置
 *
 *        每个过滤器都有4种配置情况: 16位列表 16位屏蔽 32位列表 32位屏蔽
 *        屏蔽模式下： 1 代表必须一致  0 随意
 *        16位组成情况: 11bit STID +1bit RTR +1bitIDE +3bit EXID
 *        32位组成情况: 11bit STID +18bit EXID +1bitIDE +1biRTR +1bit 0
 *
 *        1.16位列表: <<5 是因为id是11位,默认是数据帧, |1<4位为遥控帧
 *          	filter_mask_low = 0x234 << 5;
 *              filter_list_low = 0x345 << 5;
 *              filter_mask_high = 0x567 << 5;
 *              filter_list_high = 0x234 << 5;
 *        2.16位屏蔽: mask是屏蔽位 0x700<<5 id前3位必须匹配  1<<4:RTR位必须匹配  1<<3:IDE位必须匹配
 *              filter_list_high = 0x567 << 5;
 *              filter_mask_high = (0x700<<5)|(1<<4)|(1<<3)；
 *              filter_list_low = 0x200 << 5;
 *              filter_mask_low = (0x700<<5)|(1<<4)|(1<<3)；
 *        3.32位列表  <<3 是因为id是29位 1<<2:代表扩展格式 1<<2 表示扩展格式  1<<1:表示遥控帧
 *              uint32_t ID2 = (0x12345678u << 3) | (1<<2)|(1<<1);
 *              uint32_t ID3 = (0x12322678u << 3) | (1<<2)|(1<<1);
 *              filter_list_high = ID2>>16;
 *              filter_list_low = ID2;
 *              filter_mask_high =ID3>>16;
 *              filter_mask_low =ID3；
 *        4.32位屏蔽  <<3 是因为id是29位     1<<2 表示扩展格式  1<<1:表示遥控帧
 *              uint32_t ID = (0x12345600u << 3) | (1<<2)|(1<<1);
 *              uint32_t mask = (0x1FFFFF00u << 3) | (1<<2)|(1<<1);
 *              filter_list_high=ID>>16;
 *              filter_list_low=ID;
 *              filter_mask_high=mask>>16;
 *              filter_mask_low =mask；
 *        注意:
 *          在配置16位掩码模式时 如果只配一组 那么另外一组默认为0000 都可以通过，所以应该: 应该把第二组的ID和Mask也设置为一样，或者只把mask改为0xffff
 *
 * ***************************************
 */
#ifndef __CAN_DRV_H__
#define __CAN_DRV_H__
#include "gd32f30x.h"
#include <stdio.h>

 /***********GPIO*************************/
#define CAN_TX_PORT      GPIOA
#define CAN_TX_PIN       GPIO_PIN_12
#define CAN_TX_RCU       RCU_GPIOA

#define CAN_RX_PORT      GPIOA
#define CAN_RX_PIN       GPIO_PIN_11
#define CAN_RX_RCU       RCU_GPIOA
/***************CAN*********************/
#define  CAN_X   			    CAN0
#define  CAN_X_RCU   			RCU_CAN0


/***************CAN FILTER 0*********************/
// 屏蔽模式 CAN_FILTERMODE_MASK  列表模式 CAN_FILTERMODE_LIST
// 32位: CAN_FILTERBITS_32BIT  16位: CAN_FILTERBITS_16BIT

#define FILTER0_MODE         CAN_FILTERMODE_MASK
#define FILTER0_BITS         CAN_FILTERBITS_32BIT

#define FILTER0_FDATA0_VALUE  ((0x12345679u << 3) | (1 << 2)) //基准ID
#define FILTER0_FDATA1_VALUE  ((0xFFF00000u << 3) | (1 << 2)) // 掩码

#define FILTER0_LIST_HIGH    ((FILTER0_FDATA0_VALUE >> 16) & 0xFFFF)  // 高16位（仅保留低16位有效部分）
#define FILTER0_LIST_LOW     (FILTER0_FDATA0_VALUE & 0xFFFF)          // 低16位（显式截取）
#define FILTER0_MASK_HIGH    ((FILTER0_FDATA1_VALUE >> 16) & 0xFFFF)  // 高16位
#define FILTER0_MASK_LOW     (FILTER0_FDATA1_VALUE & 0xFFFF)          // 低16位（显式截取）

/***************FUNCTION*********************/
/**
 * @desc  : 发送消息
 * @date  : 2025-07-30
 * @author: AnRui
 * @param : TxMessage - {参数说明}:
 * @note  :
 */
void MyCANTransmit(can_trasnmit_message_struct* TxMessage);

/**
 * @desc  : 检测是否接收到消息
 * @date  : 2025-07-30
 * @author: AnRui
 * @return: uint8_t
 * @note  :
 */
uint8_t MyCANReceiveFlag(void);

/**
 * @desc  : 接受消息
 * @date  : 2025-07-30
 * @author: AnRui
 * @param : RxMessage - {参数说明}:
 * @note  :
 */
void MyCAN_Receive(can_receive_message_struct* RxMessage);

/**
 * @desc  : CAN控制器初始化
 * @date  : 2025-07-30
 * @author: AnRui
 * @note  :
 */
void CANDrvInit(void);

/**
 * @desc  : CAN控制器测试
 * @date  : 2025-07-31
 * @author: AnRui
 * @note  :
 */
void CANDrvTest(void);

#endif
